package org.sukui.starter.verticles

import io.vertx.config.ConfigRetriever
import io.vertx.config.ConfigRetrieverOptions
import io.vertx.config.ConfigStoreOptions
import io.vertx.core.Future
import io.vertx.core.impl.logging.LoggerFactory
import io.vertx.core.json.JsonObject
import io.vertx.ext.web.Router
import io.vertx.ext.web.handler.CorsHandler
import io.vertx.ext.web.handler.LoggerHandler
import io.vertx.ext.web.handler.SessionHandler
import io.vertx.ext.web.handler.StaticHandler
import io.vertx.ext.web.sstore.LocalSessionStore
import io.vertx.kotlin.coroutines.CoroutineVerticle

class WebVerticle : CoroutineVerticle() {

  private val log = LoggerFactory.getLogger(WebVerticle::class.java)

  override suspend fun start() {
    val router: Router = Router.router(vertx)
    router.route().handler(LoggerHandler.create())
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
    router.route().handler(CorsHandler.create("*"));
    // 静态资源映射
    router.route().handler(StaticHandler.create("static"));

    router.get("/hello").handler { ctx ->
      // bus address, 传递参数
      // todo 其实我认为可以设置一个接口, 然后给双方实现, 这样可以规避 address 的问题
      vertx.eventBus().request<String>("sys:users:list", "") { msg ->
        // 将返回的 msg 响应到浏览器
        ctx.end(msg.result().body())
      }
    }

    // 启动server
    startHttpServer(router)
  }

  /**
   * 启动 http server
   */
  private fun startHttpServer(router: Router) {
    val port = config.getJsonObject("http").getInteger("port")
    vertx
      .createHttpServer()
      .requestHandler(router)
      .listen(port)
      .onSuccess {
        log.info("Vertx Server Started on ${port}!")
      }
      .onFailure { err ->
        log.error("Vertx Server Start Failure !", err)
      }
  }
}
